package boot.spring.listener;

import org.apache.activemq.command.ActiveMQObjectMessage;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import boot.spring.po.Mail;

import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.TextMessage;
import java.util.Map;

@Component
public class QueueListener1 {

	/**
	 * Session.AUTO_ACKNOWLEDGE 自动签收
	 * @param mail
	 */
//	@JmsListener(destination = "myqueue", containerFactory = "jmsListenerContainerQueue")
//	public void displayMail(Mail mail) {
//		System.out.println("listen1从ActiveMQ队列myqueue中取出一条消息：");
//		System.out.println(mail.toString());
//	}

	/**
	 * Session.CLIENT_ACKNOWLEDGE 优化后的，增加应答的模式
	 * @param text
	 * @param session
	 * @throws JMSException
	 */
//	@JmsListener(destination = "myqueue", containerFactory = "jmsListenerContainerQueue")
//	public void receiveQueue(final ActiveMQObjectMessage text, Session session)
//			throws JMSException {
//		try {
//			System.out.println("Consumer收到的报文为:" + text.getObject());
//			// 使用手动签收模式，需要手动的调用，如果不在catch中调用session.recover()消息只会在重启服务后重发
//			//Session.CLIENT_ACKNOWLEDGE 手动签收需要调用 acknowledge 方法
////			text.acknowledge();
//		} catch (Exception e) {
//			// 此不可省略 重发信息使用
//			session.recover();
//		}
//	}

	/**
	 * 使用事务机制接收消息 使用事务机制发送消息：JmsListenerContainerFactory bean 设置 .setSessionTransacted(true);
	 * @param text
	 * @param session
	 * @throws JMSException
	 */
	@JmsListener(destination = "myqueue", containerFactory = "jmsListenerContainerQueue")
	public void receiveQueueBySession(final ActiveMQObjectMessage text, Session session) throws JMSException {
		try {
			System.out.println("Consumer收到的报文为:" + text.getObject());
			// 使用手动签收模式，需要手动的调用，如果不在catch中调用session.recover()消息只会在重启服务后重发
			//Session.SESSION_TRANSACTED 手动签收需要调用 acknowledge 方法
			session.commit();
		} catch (Exception e) {
			// 此不可省略 重发信息使用
			session.recover();
		}
	}
}
